<?php

class FicheVitrineAddModelModuleFrontController extends VitrineFrontController {
	
	public function initContent() {
		
		parent :: initContent();
		$abo = $this->checkAbo();
		
		$customer = Context::getContext()->customer;
		$message = "";

		$link = new Link();
		
		$linkModule = $link->getModuleLink('fichevitrine', 'default');
		$linkListModel = $link->getModuleLink('fichevitrine', 'list', array("type"=>Fiche::FICHE_MODELE));
		$linkListFiche = $link->getModuleLink('fichevitrine', 'list', array("type" => Fiche::FICHE));
		$linkAdd = $link->getModuleLink('fichevitrine', 'addmodel');
		$linkEditor = $link->getModuleLink('fichevitrine', 'editormodel');
		$linkAddFiche = $link->getModuleLink('fichevitrine', 'addfiche');
		$linkAddModel = $link->getModuleLink('fichevitrine', 'addmodel');
		$linkPrint = $link->getModuleLink('fichevitrine', 'print');
		
		// LVM : on pourrait traduire déjà ici et pas dans le tpl
		//       comme les types (Fiche/Modèle), type de transaction (Vente/Location), orientation (Paysage/Portrait) et Domaine (Public/Privé)
		$themes = FicheTheme::findAll();
		
		// LVM : 1 seule variable suffit
		//$props = FicheProp::findAll();	
		
		// LVM : on pourrait traduire déjà ici et pas dans le tpl
		//       comme les types (Fiche/Modèle), type de transaction (Vente/Location), orientation (Paysage/Portrait) et Domaine (Public/Privé)
		$goodTypes = FicheProp::findAll();
		
		$defaultFormat = Fiche::DEFAULT_FORMAT;
		$defaultName = Fiche::getDefaultModelName($customer->id);
		$message = $this->create();
		
		// LVM : on remonte info dans la classe Fiche
		/*
		$types = array();
		$types[Fiche::ALL] = 'Tous';
		$types[Fiche::FICHE] = 'Fiche';
		$types[Fiche::FICHE_MODELE] = 'Modèle';
		*/
		$types = Fiche::getTypes(true);
		$orientations = Fiche::getOrientations(true);
		$transacts = Fiche::getTransacts(true);
		$domains = Fiche::getDomains(true);
		
		$formats = Fiche::getFormats();
		
		//var_dump($types);
		//exit;
		
		$conditions = $this->getConditionsFilters();
		
		// LVM : ne pas prendre les fiches ou modèles supprimées.
		//       En fait le filtrage est fait plus loin par défaut dans Fiche::findFicheBy
		//$conditions['active'] = array ("column" => "active", "operator" => "=", "value" => 1);
		//$conditions['active'] = 1;
		
		// LVM
		//var_dump($conditions);		
		//exit;
		
		$fiches = Fiche::findFicheBy($conditions);
		
		// LVM : erreur de cast !!!
		//$currentFormat 		= ( isset($_POST['f_format']) ) 	? (int)($_POST['f_format']) 	: '-1';
		$currentFormat 		= ( isset($_POST['f_format']) ) 	? $_POST['f_format'] 	: -1;
		
		// LVM
		//$currentType 		= ( isset($_POST['f_type']) ) 	 	? (int)($_POST['f_type']) 		: Fiche::ALL;
		$currentType 		= ( isset($_POST['f_type']) ) 	 	? (int)($_POST['f_type']) 		: -1;
		
		$currentTheme 		= ( isset($_POST['f_theme']) ) 	 	? (int)($_POST['f_theme']) 		: -1;
		$currentOrientation = ( isset($_POST['f_orientation']) )? (int)($_POST['f_orientation']): -1;
		
		// LVM
		//$currentDomain 		= ( isset($_POST['f_domain']) )		? (int)($_POST['f_domain']) 	: Fiche::ALL;
		$currentDomain 		= ( isset($_POST['f_domain']) )		? (int)($_POST['f_domain']) 	: -1;
		
		// LVM
		//$currentRent 		= ( isset($_POST['f_rent']) )		? (int)($_POST['f_rent']) 		: -1;
		$currentTransact 	= ( isset($_POST['f_transact']) )		? (int)($_POST['f_transact']) 		: -1;
		
		$currentGoodType 	= ( isset($_POST['f_good']) )		? (int)($_POST['f_good']) 		: -1;
		
		$weightModulator = Fiche::WEIGHT_MODULATOR;
		$totalWeight = round(Fiche::getTotalWeight($customer) / $weightModulator , 2);
		$maxWeight = round($abo->storeSize / $weightModulator, 2);
		
		$defaultFiche = new Fiche();
		$defaultFiche->id_fiche = -1;
		$defaultFiche->name = "";
		$defaultFiche->format = "";
		$defaultFiche->orientation = -1;
		
		
		// LVM : nom du groupe du user (on aurait pu ici se baser sur l'id du groupe pour ne pas être obligé de forcer la langue fr)
		$groupnamelfv_customer = FicheAbo::getGroupnameLFVCustomer($customer->id, $id_lang='5');
		
		// On pourrait aussi mettre groupname_customer dans l'objet $customer mais peut-être pb de définition propriété objet... 
		//$customer->groupname = $groupname_customer;
		
		array_unshift($fiches, $defaultFiche);
		
		$this->context->smarty->assign(array(
			'goodTypes' => $goodTypes,
			
			'totalWeight'=> $totalWeight,
			'maxWeight'=> $maxWeight,
			
			'types' => $types,
			
			// LVM : addition info type de transactions Location ou Vente (ou autres plus tard : Viager par ex)
			'transacts' => $transacts,
			
			'fiches' => $fiches,
			
			'currentType' => $currentType,
			'currentDomain' => $currentDomain,
			'currentTheme' => $currentTheme,
			'currentGoodType' => $currentGoodType,
			'currentOrientation' => $currentOrientation,
			
			// LVM
			//'currentRent' => $currentRent,
			'currentTransact' => $currentTransact,
			
			'currentFormat' => $currentFormat,
			
			// LVM : on remonte info dans la classe Fiche
			//'domains' => array("Tous"=>Fiche::ALL,"Public"=>Fiche::PUBLIC_FICHE,"Privé"=>Fiche::PRIVATE_FICHE),
			'domains' => $domains,
			
			'linkListFiche' => $linkListFiche,
			'linkListModel' => $linkListModel,
			'linkAdd' => $linkAdd,
			'linkAddFiche' => $linkAddFiche,
			'linkAddModel' => $linkAddModel,
			'linkHome' => $linkModule,
			'linkPrint' => $linkPrint,
			'message' => $message,
			'moduleName' => 'fichevitrine',
			'defaultName' => $defaultName,
			'defaultFormat' => $defaultFormat,
			'customer' => $customer,
			'path' => 'Fiche Vitrine',
			
			'themes' => $themes,
			
			// LVM : on utilise la variable goodTypes
			//'props' => $props,
			
			'manual' => Fiche::getManURI(),
			
			// LVM : on remonte info dans la classe Fiche
			//'orientations' => array("paysage"=>Fiche::LANDSCAPE, "portrait"=>Fiche::PORTRAIT),
			'orientations' => $orientations,
			
			// LVM
			//"formats" => array_keys(Fiche::getFormats())
			"formats" => array_keys($formats),
			
			// LVM
			'groupnamelfv_customer' => $groupnamelfv_customer
		));
		
		$this->setTemplate('addmodel.tpl');
	}
	
	protected function create()
	{
	
		$message = "";
		$link = new Link();
		$linkModule = $link->getModuleLink('fichevitrine', 'default');
		$linkEditor = $link->getModuleLink('fichevitrine', 'editormodel');
		$customer = Context::getContext()->customer;
		
		if ( isset($_POST['submitAddForm']) && !empty($_POST['submitAddForm']) )
		{
			$modelId = (isset($_POST['modelId'])) ? (int)($_POST['modelId']) : -1;
			
			// LVM
			//$rentId = (isset($_POST['rent'])) ? (int)($_POST['rent']) : -1;
			$transactId = (isset($_POST['transact'])) ? (int)($_POST['transact']) : -1;
			
			$propId = (isset($_POST['propId'])) ? (int)($_POST['propId']) : -1;
			$public = ( isset($_POST['isPublic']) ) ? true : false;
			$format = ( isset($_POST['format']) && !empty($_POST['format']) ) ? $_POST['format'] : Fiche::DEFAULT_FORMAT;
			$orientation = ( isset($_POST['orientation']) && !empty($_POST['orientation']) ) ? $_POST['orientation'] : Fiche::LANDSCAPE;
			
			// LVM
			$theme = ( isset($_POST['theme']) && !empty($_POST['theme']) ) ? $_POST['theme'] : -1;
			
			Fiche::addFiche(	$_POST['name'], 
								Fiche::FICHE_MODELE, 
								$customer->id, 
								$modelId, 
								
								// LVM
								//$rentId, 
								$transactId,
								
								$propId, 
								
								// LVM
								//(int)($_POST['theme']), 
								$theme,
								
								$public,
								$format,
								$orientation);
			
			$lastInsertedFiche = Fiche::getLastFiche();
			
			if ( $lastInsertedFiche != null )
			{
				$linkEditor = $link->getModuleLink('fichevitrine', 'editormodel', array("ficheId"=>$lastInsertedFiche->id));
				Tools::redirect($linkEditor);
				//$message = "Votre fiche a bien été créée en se basant sur le modèle: ".$modelId;
			}
			else
			{
				$message = "Erreur lors de la création du modèle.";
			}
		}
		
		return $message;
	}
	
	protected function getConditionsFilters()
	{
		$customer 			= Context::getContext()->customer;
		
		//var_dump($customer);
		
		// LVM : erreur de cast !!!
		//$currentFormat 		= ( isset($_POST['f_format']) ) 	? (int)($_POST['f_format']) 	: '-1';
		$currentFormat 		= ( isset($_POST['f_format']) ) 	? $_POST['f_format'] 	: -1;
		
		// LVM
		//$currentType 		= ( isset($_POST['f_type']) ) 	 	? (int)($_POST['f_type']) 		: Fiche::ALL;
		$currentType 		= ( isset($_POST['f_type']) ) 	 	? (int)($_POST['f_type']) 		: -1;
		
		$currentTheme 		= ( isset($_POST['f_theme']) ) 	 	? (int)($_POST['f_theme']) 		: -1;
		$currentOrientation = ( isset($_POST['f_orientation']) )? (int)($_POST['f_orientation']): -1;
		
		// LVM
		//$currentRent 		= ( isset($_POST['f_rent']) )		? (int)($_POST['f_rent']) 		: -1;
		$currentTransact 	= ( isset($_POST['f_transact']) )		? (int)($_POST['f_transact']) 		: -1;
		
		$currentGoodType 	= ( isset($_POST['f_good']) )		? (int)($_POST['f_good']) 		: -1;
		
		// LVM
		//$currentDomain 		= ( isset($_POST['f_domain']) )		? (int)($_POST['f_domain']) 	: Fiche::ALL;
		$currentDomain 		= ( isset($_POST['f_domain']) )		? (int)($_POST['f_domain']) 	: -1;
		
		$conditions = array();
		
		// filtre sur les types de biens
		// LVM
		//if ( isset($_POST['f_good'] ) )
		if (1)
		{
			// LVM : on l'a calculé au dessus en gérant les -1... donc on enlève.
			//$currentGoodType = (int)($_POST['f_good']);
			
			if ($currentGoodType != -1)
				$conditions['propId'] = $currentGoodType;
		}
		
		// filtre sur location/vente
		
		// LVM
		/*
		if ( isset($_POST['f_rent']) )
		{
			$currentRent = (int)($_POST['f_rent']);
			
			if( $currentRent != -1 )
				$conditions['rent'] = $currentRent;
		}			
		*/
		// LVM
		//if ( isset($_POST['f_transact']) )
		if (1)
		{
			// LVM : on l'a calculé au dessus en gérant les -1... donc on enlève.
			//$currentTransact = (int)($_POST['f_transact']);
			
			if ($currentTransact != -1)
				$conditions['rent'] = $currentTransact;
		}			
		
		// filtre sur l'orientation
		// LVM
		//if ( isset($_POST['f_orientation']) )
		if (1)
		{
			// LVM : on l'a calculé au dessus en gérant les -1... donc on enlève.
			//$currentOrientation = (int)($_POST['f_orientation']);
			
			if ($currentOrientation != -1)
				$conditions['orientation'] = $currentOrientation;
		}		
		
		// filtre sur le format
		// LVM
		//if ( isset($_POST['f_format']) )
		if (1)
		{
			// LVM : on l'a calculé au dessus en gérant les -1... donc on enlève.
			//$currentFormat = $_POST['f_format'];
			
			if ($currentFormat != -1)
				$conditions['format'] = $currentFormat;
		}

		// filtre sur les themes
		// LVM
		//if ( isset($_POST['f_theme'] ) )
		if (1)
		{
			// LVM : on l'a calculé au dessus en gérant les -1... donc on enlève.
			//$currentTheme = (int)($_POST['f_theme']);
			
			if( $currentTheme != -1 )
				$conditions['theme'] = $currentTheme;
		}
		
		// filtre sur le type
		// LVM
		//if ( isset($_POST['f_type']) )
		if (1)
		{
			// LVM : on l'a calculé au dessus en gérant les -1... donc on enlève.
			//$currentType = (int)($_POST['f_type']);
			
			// LVM
			//if ( $currentType != Fiche::ALL )
			if ( $currentType != -1 )
			{
				$conditions['type'] = $currentType;
			}
		}
		
		// filtre sur le domaine publique ou privé
		// LVM
		//if ( isset($_POST['f_domain'] ) )
		if (1)
		{
			// LVM : le -1 est exclu d'office car pas dans les tests...
			if ($currentDomain == Fiche::PRIVATE_FICHE)
			{
				$conditions['id_customer'] = (int)($customer->id);
				
				$conditions['public'] = Fiche::PRIVATE_FICHE;
			}
			elseif ($currentDomain == Fiche::PUBLIC_FICHE)
			{
				$conditions['public'] = Fiche::PUBLIC_FICHE;
			}
			
			// LVM : on doit gérer les cas qui suivent dans tous les cas (filtrage sur public/privé ou non)
			//else
			{
				// LVM : pose pb car il faudrait des parenthèses sur ces 2 conditions
				//       Cela entraîne d'afficher les fiches/modèles supprimés 
				//       et d'empêcher tout autre filtrage (orientation, format, ...)
				//       Il faudrait pouvoir relier 2 conditions ou appeler déjà buildWhereClause
				
				/*
				$conditions['id_customer'] = (int)($customer->id);
								
				$conditions['public'] = array(	"column" => "public",
												"operator" => "=",
												"value" => Fiche::PUBLIC_FICHE,
												"conditionnal"=>"OR");
				*/
				
				// Modèle privé : l'utilisateur peut voir ses propres modèles bien sûr
				$conditions2['id_customer'] = (int)($customer->id);
				
				// Utiliser Fiche::buildWhereClause pour un seul paramètre n'est pas super léger
				// (car besoin de réorganiser avec le besoin de visibilité de modèle public par groupe d'utilisateur Prestashop)
				$whereClause = Fiche::buildWhereClause($conditions2, $prefixetable='f');
				
				// Enlever le Where...
				//$whereClause = str_replace ('WHERE', '', $whereClause);
				//$whereClause = str_replace ('where', '', $whereClause);
				$whereClause = str_ireplace ('where', '', $whereClause);
					
				// Pour gérer les modèles public par 'groupe' (et non plus visible par tous par défaut) il faut modifier de la façon suivante :
				
				// Si le modèle public a été créé par un user qui n'appartient à aucun groupe d'utilisateur Prestashop il est visible par tous
				// Si le modèle public a été créé par un user qui appartient à un groupe Prestashop il n'est visible que pour les autres membres du groupe
				// (en plus de soi-même bien sûr)
				// Il faudra afficher dans la liste des modèle/fiche quel user possède le modèle pour plus de clarté et donc savoir qui peut modifier le modèle.
				//$conditions2['public'] = array(	"column" => "public", "operator" => "=", "value" => Fiche::PUBLIC_FICHE, "conditionnal" => "OR");
				
				// Récupérer le groupe d'un user ?
				// On recherche si 2 users possèdent au moins un groupe commun dont le nom commence par 'LFV'...
				// Le français, langue du B.O en interne LVM, a pour id_lang = 5
				
				// On récupère la méthode pour trouver les groupes d'un client
				// mais ne donne rien d'autre que l'id. Pas d'autres infos comme le nom...
				//$groups = Customer::getGroupsStatic($id_customer)
						
				
				// 2 cas : 
				//
				// Cas n°1 : le user n'appartient à aucun groupe LFV
				//           Il doit voir ses propres modèle/fiche privé 
				//           + les modèle/fiche public de tous les users qui n'appartiennent pas à un groupe LFV
				
				// Cas n°2 : le user appartient à un groupe LFV
				//           Il doit voir ses propres modèle/fiche privé 
				//           + les modèle/fiche public de tous les users qui n'appartiennent pas à un groupe LFV 
				//           + les modèle/fiche public des users de son groupe LFV
			
				// Besoin optimisation car la requête qui suit multiplie par 800 la durée de la requête (40s Vs 0.05s)
				// On va la calculer à part et mettre le résultat ensuite.
				
				// Ce n'est pas la bonne tactique. Si on écarte seulement les groupes LFV on tombe sur les groupes Client, ...
				// des user qui ont aussi les groupes Client, Invité, ...
				// et si on écarte aussi les groupes Clients, ... on n'obtient plus aucun résultat !!!
				// On doit donc écarter les users de groupe LFV sans les retrouver à nouveau avec un groupe Client, ...
				
				/*
				$cond_user_not_in_group_lfv = 'SELECT DISTINCT f3.id_customer FROM ' ._DB_PREFIX_ . 'fiche as f3';
				$cond_user_not_in_group_lfv .= ' WHERE f3.id_customer NOT IN (SELECT DISTINCT f2.id_customer FROM ' ._DB_PREFIX_ . 'fiche as f2, '.  _DB_PREFIX_ . 'group_lang as gl2, '. _DB_PREFIX_ . 'customer_group as cg2';
				$cond_user_not_in_group_lfv .= ' WHERE f2.id_customer = cg2.id_customer';
				$cond_user_not_in_group_lfv .= ' AND gl2.id_group = cg2.id_group';
				$cond_user_not_in_group_lfv .= " AND gl2.name LIKE 'LFV%'";
				$cond_user_not_in_group_lfv .= ' AND gl2.id_lang = 5'.')';
				*/
				$cond_user_not_in_group_lfv = Fiche::getIdCustomerListNotInGroupLFV ($id_lang=5);
					
				// Cas n°1 principale condition : Public et n'appartient à aucun groupe débutant par 'LFV' (car un user appartient toujours à au moins 1 groupe : customer, invité, ...)
				$cond1 = '(f.public = '.Fiche::PUBLIC_FICHE;
			
				$cond1 .= ' AND f.id_customer IN ('.$cond_user_not_in_group_lfv.')';
				
				$cond1 .= ')';
						
				// Cas 2 principale condition : les modèle/fiche public des users de son propre groupe LFV
				// Et comment remonter cette information pour avoir des 'public groupe' en plus des 'public privé' et 'public public' ?
				// Il suffit de remonter le groupe de la fiche remontée et ensuite dans le tpl le $customer doit contenir son groupe
				// ou simplement récupérer le groupe du user en cours en requêtant indépendamment...
				
				// Besoin optimisation car la requête qui suit multiplie par 800 la durée de la requête (40s Vs 0.05s)
				// On va la calculer à part et mettre le résultat ensuite.
				
				/*
				$cond_group_name_user_in_group_lfv = '('.'SELECT gl4.name FROM ' . _DB_PREFIX_ . 'group_lang as gl4, '. _DB_PREFIX_ . 'customer_group as cg4';
				$cond_group_name_user_in_group_lfv .= ' WHERE cg4.id_customer = '.(int)($customer->id);
				$cond_group_name_user_in_group_lfv .= ' AND gl4.id_group = cg4.id_group';
				$cond_group_name_user_in_group_lfv .= " AND gl4.name LIKE 'LFV%'";
				$cond_group_name_user_in_group_lfv .= ' AND gl4.id_lang = 5'.')';
				*/
				$cond_group_name_user_in_group_lfv = FicheAbo::getGroupnameLFVCustomer($customer->id, $id_lang=5);
				
				$cond2 = '(f.public = '.Fiche::PUBLIC_FICHE;
				
				//$cond2 .= ' AND gl.name = '.$cond_group_name_user_in_group_lfv;
				$cond2 .= " AND gl.name = '".$cond_group_name_user_in_group_lfv."'";
				
				$cond2 .= ')';
													
				$whereClause .= ' OR '.$cond1.' OR '.$cond2;
				//
				
				$whereClause = '('.$whereClause.')';
				
				$whereClause .= ' AND cg.id_customer = f.id_customer';
				$whereClause .= ' AND gl.id_group = cg.id_group';
				
				//$whereClause .= ' AND cg4.id_customer = f.id_customer';
				//$whereClause .= ' AND gl4.id_group = cg4.id_group';
				
				$whereClause = '('.$whereClause.')';
				
				//$sql .= ' AND cg.id_customer = f.id_customer';
				//$sql .= ' AND gl.id_group = cg.id_group';
					
				
				// Spécial dans le sens où on va prendre le whereclause sans y toucher.
				// Le mettre tel quel. On recherchera des parenthèses dans Fiche::buildWhereClause
				// pour un traitement spécial...
				$conditions['special_parenthese_modele_public'] = $whereClause;							
			}
		}
		/*
		else
		{
			// LVM : jamais appelé normalement car f_domain est 'ALL' pour 'Tous' soit 100000
			//       Cela poserait le même pb de parenthèse qu'au dessus. Blindons quand même...
			
			
			//$conditions['id_customer'] = (int)($customer->id);
			
			//$conditions['public'] = array(	"column" => "public", "operator" => "=", "value" => Fiche::PUBLIC_FICHE, "conditionnal" => "OR");
			
			$conditions2['id_customer'] = (int)($customer->id);
								
			$conditions2['public'] = array(	"column" => "public",
											"operator" => "=",
											"value" => Fiche::PUBLIC_FICHE,
											"conditionnal" => "OR");
																			
			$whereClause = Fiche::buildWhereClause($conditions2);
			
			// Enlever le Where...
			//$whereClause = str_replace ('WHERE', '', $whereClause);
			//$whereClause = str_replace ('where', '', $whereClause);
			$whereClause = str_ireplace ('where', '', $whereClause);
				
			$whereClause = '('.$whereClause.')';	
			
			// Spécial dans le sens où on va prendre le whereclause sans y toucher.
			// Le mettre tel quel. On recherchera des parenthèses dans Fiche::buildWhereClause
			// pour un traitement spécial...
			$conditions['special_parenthese'] = $whereClause;	
		}
		*/
			
		return $conditions;
	}
}
